import {AxiosRequestConfig, AxiosResponse, Canceler} from "axios";
import  NProgress  from 'nprogress'
import 'nprogress/nprogress.css'
import { message } from 'antd';
// 1. weiYao-jasmine 的工具库(其实就是我的)
const  { http:Instance } = require('jt-utils');

// 防止多次请求进度条重复加载

let loadingNum = 0;
const startLoading = () => {
    if (loadingNum === 0) {
        NProgress.start()
        message.loading('加载中')
    }
    loadingNum++;
}
const endLoading = () => {
    loadingNum--
    if (loadingNum <= 0) {
        NProgress.done()
        message.success('加载完成')
    }
}

// 配置进度条参数
NProgress.configure({ showSpinner: false, minimum: 0.3, speed: 2000});
// 2. 初始化 axios 实例对象
Instance.init({
    url: '',
    timeout: 20000,
    withCredentials: false,
});
// 3. 关闭封装完成的拦截器,开启自定义的拦截功能
const Interceptor =  Instance.isInterceptor(false);

// 4. 添加请求拦截器
Interceptor.request.use( (config: AxiosRequestConfig) =>{
    // 在发送请求之前做些什么
// 1. 加载进度条
    startLoading();

    return config;
}, function (error:AxiosRequestConfig) {
    // 对请求错误做些什么
    return Promise.reject(error);
});

// 5.添加响应拦截器
Interceptor.response.use( (response: AxiosResponse) =>{
    // 对响应数据做点什么
    // 1. 结束进度条
    endLoading();
    return response;
}, function (error: AxiosResponse ) {
    // 对响应错误做点什么
    return Promise.reject(error);
});

export const generateCancelToken = () => {
    let cancel = null;
    const cancelToken = new Instance.CancelToken((c:Canceler) => {
        cancel = c;
    });
    return {
        cancel,
        cancelToken
    };
};


export default Instance ;
